const util = require('util');

// async function delay(duration = 1000) {
//   return new Promise(resolve => {
//     setTimeout(() => {
//       resolve(duration);
//     }, duration);
//   });
// }

// delay(500).then((r) => {
//   console.log(r);
// });

// callbackify 将 promise 转换成 callback  回调形式
// const delayCallback = util.callbackify(delay);

// delayCallback(500, (err, d) => { // 这后面 相当于 .then
//   console.log(d);
// });

// function delayCallBack1(duration, callback) {
// 传入 callback 函数 一定情况下 执行 callback
//   setTimeout(() => {
//     callback(null, duration);
//   }, duration);
// }

// promisify 将 callback形式的函数 转换成 promise 形式

// const delay = util.promisify(delayCallBack1);
// (async () => {
//   const r = await delay(500);
//   console.log(r);
// })();

// 500 相当于参数
// delay(500).then((r) => {
//  这里的相当于 callback
//   console.log(r);
// }，(err）=>{});

const obj1 = {
  a: 1,
  b: {
    c: 3,
    d: {
      e: 5,
    },
  },
};

const obj2 = {
  a: 1,
  b: {
    c: 3,
    d: {
      e: 5,
      g: 6,
    },
  },
};

// 是否深度严格相等  遍历深度比较
console.log(util.isDeepStrictEqual(obj1, obj2));

// 原理
function callbackify(original) {
  return function (...args) {
    const callback = args.pop(); // 拿到最后一个参数 回调函数
    if (typeof callback !== 'function') {
      throw new TypeError('Callback must be a function');
    }

    original(...args).then(
      (r) => callback(null, r),
      (err) => callback(err)
    );
  };
}

function promisify(original) {
  return function (...args) {
    return new Promise((resolve, reject) => {
      original(...args, (err, r) => {
        // 这个函数相当于 callback函数
        if (err) {
          reject(err);
        } else {
          resolve(r);
        }
      });
    });
  };
}
